home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #288 (1993)(Rhein-Sieg-Soft).zip / Franz PD Disk #288 (1993)(Rhein-Sieg-Soft).adf / Knobeln / MINIMAX.LST < prev    next >
File List  |  1992-10-09  |  10KB  |  307 lines

  1. ' *********************************
  2. ' *          MiniMax V 1.07      *
  3. ' *   © 8.10.1992 by Henry könig  *
  4. ' * Bornheide 71, 2000 Hamburg 53 *
  5. ' *********************************
  6. init
  7. anleitung
  8. game:
  9. programmkopf
  10. CLEAR                           ! Variablen löschen
  11. init.spiel
  12. spielen                         ! zur Spiel-Prozedur
  13. PROCEDURE anleitung
  14.   programmkopf
  15.   PRINT AT(1,5);"MiniMax ist ein kleines Strategiespiel mit Zahlen."
  16.   PRINT
  17.   PRINT "Auf einem Spielbrett, das in je acht Zeilen und Spalten eingeteilt ist,"
  18.   PRINT
  19.   PRINT "müssen Zahlen aus einer senkrecht markierten Spalte ausgewählt werden."
  20.   PRINT
  21.   PRINT "Der Punktestand wird um diese Zahl erhöht und die Zahl aus dem Spielfeld"
  22.   PRINT
  23.   PRINT "entfernt. Die ausgewählte Zahl bestimmt die waagerechte Reihe aus welcher der"
  24.   PRINT
  25.   PRINT "Computer wählen darf. Das Spiel ist beendet, wenn alle Felder gelöscht sind"
  26.   PRINT
  27.   PRINT "oder wenn kein Spieler in der aktuellen Spalte oder Reihe ein Feld mehr wählen"
  28.   PRINT
  29.   PRINT "kann. Gewinner ist der, der den höchsten Punktestand erreicht."
  30.   PRINT
  31.   PRINT "Durch eine 'Ja/Nein'-Abfrage kann ein neues Spiel begonnen werden."
  32.   PRINT
  33.   PRINT "Das Spiel kann jederzeit durch das Anklicken des Endeschalters abgebrochen"
  34.   PRINT
  35.   PRINT "werden."
  36.   urheber
  37.   tastendruck
  38. RETURN
  39. PROCEDURE beenden               ! Programm beenden
  40.   CLOSEW #1                     ! Fenster schließen
  41.   CLOSES 1                      ! Bildschirm schließen
  42.   END                           ! und zur Workbench
  43. RETURN
  44. PROCEDURE computer.spielt
  45.   CLR j%                        ! Spaltenzähler löschen
  46.   FOR i%=1 TO 8
  47.     IF feld%(i%,ze%)=0 THEN     ! Feld ist leer
  48.       j%=j%+1                   ! Feld plus 1
  49.     ENDIF
  50.   NEXT i%
  51.   IF j%=8 THEN                  ! alle Felder leer
  52.     ende                        ! Spielstand anzeigen und ende
  53.   ENDIF
  54.   FOR i%=1 TO 8                 !
  55.     a%(i%)=0
  56.     FOR j%=1 TO 8
  57.       IF j%=ze% THEN
  58.         j%=j%+1
  59.       ENDIF
  60.       IF j%<9 THEN
  61.         IF feld%(i%,j%)=>a%(i%) THEN
  62.           a%(i%)=feld%(i%,j%)
  63.         ENDIF
  64.       ENDIF
  65.     NEXT j%
  66.   NEXT i%
  67.   j%=1
  68.   FOR i%=1 TO 8
  69.     a%(i%)=feld%(i%,ze%)-a%(i%)
  70.   NEXT i%
  71.   FOR i%=2 TO 8
  72.     IF a%(j%)<a%(i%) THEN
  73.       j%=i%                     !  nächste Spalte
  74.     ENDIF
  75.   NEXT i%
  76.   mz%=feld%(j%,ze%)             ! Punkte des Feldes merken
  77.   mp%=mp%+mz%                   ! Computerpunkte addieren
  78.   feld%(j%,ze%)=0               ! Feld löschen
  79.   spa%=j%                       ! aktuelle Spalte übergeben
  80.   punktestand                   ! Punktestand anzeigen
  81.   ze%=INT(y1%/8)+ze%*2          ! Zeile berechnen
  82.   j%=2+j%*4
  83.   PRINT AT(j%,ze%);"  "         ! Spielfeld löschen
  84. RETURN
  85. PROCEDURE ende                  ! Spielstand ausgeben
  86.   PCOLOR 3,0
  87.   PRINT AT(45,8);"Das Spiel ist zu Ende!"
  88.   PCOLOR 1,0
  89.   IF mp%>dp% THEN               ! Computerpunkte > Spielerpunkte
  90.     PRINT AT(40,12);"Ich habe mit ";mp%;" zu ";dp%;" gewonnen."
  91.   ELSE IF mp%=dp%
  92.     PRINT AT(40,12);"   Wir sind gleich gut"
  93.   ELSE IF mp%<dp%
  94.     PRINT AT(40,12);" Du hast mit ";dp%;" zu ";mp%;" gewonnen."
  95.   ENDIF
  96.   PCOLOR 5,0
  97.   PRINT AT(45,20);"Noch ein Spiel mit J/N ";
  98.   PCOLOR 1,0
  99.   x$=""
  100.   taste
  101.   IF UPPER$(x$)="J" THEN        ! Ja
  102.     RESUME game               ! neuse Spiel
  103.   ENDIF
  104.   beenden                       ! Programm beenden
  105. RETURN
  106. PROCEDURE falsch                ! falschen Zug anmeckern
  107.   PRINT CHR$(7);                ! Bildschirmblitz
  108.   CLR mausk%                    ! Mausposition löschen
  109. RETURN
  110. PROCEDURE farben.setzen
  111.   SETCOLOR 0,5,5,5              ! grau statt blau
  112.   SETCOLOR 1,15,15,15           ! weiß bleibt
  113.   SETCOLOR 2,0,0,0              ! schwarz erhalten
  114.   SETCOLOR 3,15,5,0             ! rot bleibt
  115.   SETCOLOR 4,10,10,10           ! hellgrau inverse Farbe im Filerequester
  116.   SETCOLOR 5,15,15,0            ! gelb
  117.   SETCOLOR 6,0,0,0              ! schwarz = Inverse Farbe im Filerequester
  118. RETURN
  119. PROCEDURE init
  120.   breite%=640                   ! Bildschirmbreite
  121.   hoehe%=256                    ! Bildschirmhöhe
  122.   ebenen%=3                     !
  123.   OPENS 1,0,0,breite%,hoehe%,ebenen%,&H8000
  124.   OPENW #1,0,0,breite%,hoehe%,&H18,&H1800,1
  125.   farben.setzen                 ! Farbpalette setzen
  126. RETURN
  127. PROCEDURE init.spiel
  128.   x1%=27                        ! linker Spielfeldrand
  129.   x2%=283                       ! rechter Spielfeldrand
  130.   y1%=11+32                     ! oberer Spielfeldrand
  131.   y2%=139+32                    ! unterer Spielfeldrand
  132.   x3%=18*8                      ! Endeschalter links
  133.   x4%=x3%+4*8
  134.   y3%=23*8                      ! Endeschalter Oberkante
  135.   y4%=y3%+8
  136.   DIM feld%(8,8)
  137.   DIM a%(8)
  138.   RANDOMIZE TIMER
  139.   FOR i%=1 TO 8
  140.     FOR j%=1 TO 8
  141.       x%=1+i%*4
  142.       y%=INT(y1%/8)+j%*2
  143.       sp%=INT(RND*99+1)         ! Feldwert per Zufall bestimmen
  144.       PRINT AT(x%,y%);SPC(3-LEN(STR$(sp%)));sp%
  145.       feld%(i%,j%)=sp%          ! Feldwert merken
  146.     NEXT j%
  147.   NEXT i%
  148.   zeichne.schalter(x1%-16,y1%-7,x2%+14,y2%+7,0)
  149.   zeichne.schalter(x1%-14,y1%-6,x2%+12,y2%+6,1)
  150.   COLOR 3
  151.   j%=y1%
  152.   FOR i%=x1% TO x2% STEP 32      ! Spielfeld zeichnen
  153.     LINE i%,y1%,i%,y2%
  154.     LINE x1%,j%,x2%,j%
  155.     j%=j%+16
  156.   NEXT i%
  157.   zeichne.schalter(x3%-16,y3%-6,x4%+16,y4%+8,0)
  158.   COLOR 3
  159.   TEXT x3%,y3%+8,"Ende"
  160.   COLOR 1
  161.   punktestand                   ! Punktestand anzeigen
  162.   urheber
  163. RETURN
  164. PROCEDURE punktestand           ! Punktestand ausgeben
  165.   PRINT AT(4,28);"Meine Punkte: ";
  166.   PCOLOR 5,0
  167.   PRINT mp%
  168.   PCOLOR 1,0
  169.   PRINT AT(24,28);"Mein Zug: ";
  170.   PCOLOR 5,0
  171.   PRINT mz%
  172.   PCOLOR 1,0
  173.   PRINT AT(44,28);"Deine Punkte: ";
  174.   PCOLOR 5,0
  175.   PRINT dp%
  176.   PCOLOR 1,0
  177. RETURN
  178. PROCEDURE reihe.einrahmen
  179.   FOR i%=y1% TO y2%-16 STEP 16
  180.     BOX sp%,i%+1,sp%+30,i%+15
  181.     BOX sp%+1,i%+2,sp%+29,i%+14
  182.   NEXT i%
  183. RETURN
  184. PROCEDURE spielen               ! Spielen
  185.   spa%=INT(RND*8+1)             ! 1. Spielspalte ermitteln
  186.   x%=RND*100                    ! 1. Spieler ermitteln
  187.   IF x%>60 THEN
  188.     ze%=spa%                    ! aktiver Spieler
  189.     computer.spielt             ! Amiga fängt an
  190.   ENDIF
  191.   CLR j%                        ! Eingangswert für die Schleife
  192.   WHILE j%<>8
  193.     sp%=(spa%-1)*32+28          ! aktuelle Spalte
  194.     CLR j%
  195.     COLOR 2                     ! schwarz
  196.     reihe.einrahmen             ! Spielreihe einrahmen
  197.     FOR i%=1 TO 8
  198.       IF feld%(spa%,i%)=0 THEN  ! Spielfeld ist leer
  199.         j%=j%+1
  200.       ENDIF
  201.     NEXT i%
  202.     IF j%=8 THEN                ! keine Reihe mehr wählbar
  203.       ende                      ! Spielstand anzeigen
  204.     ELSE
  205.       spieler                   ! Spieler ist am Zug
  206.       dp%=dp%+feld%(x%,y%)      ! Spielerpunkte addieren
  207.       feld%(x%,y%)=0            ! Feld als gespielt kennzeichnen
  208.       ze%=y%
  209.       x%=2+x%*4
  210.       y%=INT(y1%/8)+y%*2        ! Zeile berechnen
  211.       PRINT AT(x%,y%);"  "      ! Spielfeld löschen
  212.       punktestand               ! Punktestand anzeigen
  213.       COLOR 0
  214.       reihe.einrahmen           ! Spielreihe einrahmen
  215.       comp:
  216.       computer.spielt           ! Amiga ist am Zug
  217.     ENDIF
  218.   WEND
  219. RETURN
  220. PROCEDURE spieler               ! Spieler ist am Zug
  221.   CLR mausk%                    ! Mausknopf löschen
  222.   WHILE mausk%=0
  223.     mausk%=MOUSEK               ! Mausknopf abfragen
  224.     IF mausk%<>0 THEN
  225.       x%=MOUSEX                 ! Mausposition Rechtswert
  226.       y%=MOUSEY                 ! Mausposition Hochwert
  227.       IF x%<x1% OR x%>x2% OR y%<y1% OR y%>y2% THEN
  228.         falsch                  ! falschen Zug anmeckern
  229.       ELSE
  230.         x%=INT((x%-x1%)/32+1)    ! waagerechter Feld berechnen
  231.         y%=INT((y%-y1%)/16+1)    ! senkrechtes Feld berechnen
  232.         IF feld%(x%,y%)=0 OR x%<>spa% THEN ! Feld leer oder falsche Spalte
  233.           falsch                ! falschen Zug anmeckern
  234.         ENDIF
  235.       ENDIF
  236.       IF x%>x3% AND x%<x4% AND y%>y3% AND y%<y4% THEN   ! Endeschalter angeklickt
  237.         beenden                 ! Spiel beenden
  238.       ENDIF
  239.     ENDIF
  240.   WEND
  241. RETURN
  242. PROCEDURE programmkopf
  243.   CLS                           ! Bildschirm löschen
  244.   COLOR 2                       ! schwarz
  245.   PBOX 1,1,639,21               ! Box zeichnen
  246.   COLOR 0                       ! grau
  247.   PBOX 4,3,636,19               ! Box zeichnen
  248.   zeichne.schalter(1,1,639,21,1)
  249.   PCOLOR 5,0                    ! gelbe Schrift
  250.   PRINT AT(23,2);"MiniMax V 1.06"
  251.   PCOLOR 1,0                    ! weiße Schrift
  252.   programmfuss
  253. RETURN
  254. PROCEDURE programmfuss          ! Anweisungsboxen zeichnen
  255.   COLOR 2                       ! schwarz
  256.   PBOX 1,208,639,254            ! schwarze Box
  257.   COLOR 0,0                     ! grau
  258.   PBOX 6,(27*8)-5,633,(28*8)+4  ! 1. graue Box
  259.   PBOX 6,(29*8)+2,633,251       ! 2. graue Box
  260.   zeichne.schalter(5,209,633,230,1)! 1. Schalter
  261.   zeichne.schalter(5,233,633,253,0)! 2. Schalter
  262. RETURN
  263. PROCEDURE taste                 ! ein Zeichen von der Tastatur holen
  264.   CLR x%                        ! Steuerzeichen löschen
  265.   CLR mausk%
  266.   CLR mausx%                    ! Mausspalte löschen
  267.   CLR mausy%                    ! Mauszeile löschen
  268.   WHILE x%=0 AND MOUSEK=0
  269.     x$=INKEY$                   ! Zeichen von Tastatur
  270.     x%=ASC(x$)                  ! ASCII-Wert für Auswertung
  271.   WEND
  272.   IF MOUSEK<>0 THEN             ! linke Maustaste
  273.     mausx%=INT(MOUSEX/8)+1      ! ja, dann Spalte = mausx
  274.     mausy%=INT(MOUSEY/8)+1      ! Zeile = mausy
  275.     mausk%=MOUSEK               ! Maustaste
  276.   ENDIF
  277. RETURN
  278. PROCEDURE tastendruck
  279.   PRINT AT(4,28);SPACE$(74);
  280.   PCOLOR 5,0
  281.   PRINT AT(18,28);" Weiter mit beliebiger Taste oder Mausklick."
  282.   GOSUB taste
  283.   PCOLOR 1,0
  284.   PRINT AT(4,28);SPACE$(74)
  285. RETURN
  286. PROCEDURE urheber
  287.   PRINT AT(14,31);"© 1992 by Henry König, Bornheide 71, 2000 Hamburg 53"
  288. RETURN
  289. PROCEDURE zeichne.schalter(sx1%,sy1%,sx2%,sy2%,an%)
  290.   IF an% THEN
  291.     schatten%=2
  292.     licht%=4
  293.   ELSE
  294.     schatten%=4
  295.     licht%=2
  296.   ENDIF
  297.   COLOR 2                          ! schwarz
  298.   COLOR 0                          ! grau
  299.   COLOR licht%                     ! hellgrau oder schwarz
  300.   LINE sx1%+8,sy2%-4,sx2%-7,sy2%-4 ! untere Lichtlinien
  301.   LINE sx2%-7,sy1%+5,sx2%-7,sy2%-4 ! rechte Lichtlinie
  302.   COLOR schatten%                  ! schwarz oder hellgrau
  303.   LINE sx1%+8,sy1%+4,sx2%-7,sy1%+4 ! obere Schatttenlinie
  304.   LINE sx1%+8,sy1%+4,sx1%+8,sy2%-4 ! linke Schattenlinie
  305. RETURN
  306. REM
  307.